// 1.可以使用 | 来连接多个类型(多个类型也称联合类型, 也就是赋值只能在这个几个值当中)
let sex: "male" | "female" | 0 | 1 | boolean;

if (true) {
  sex = "male";
} else {
  sex = "female";
}
sex = true;
// sex = "其它字符串"; // ERROR: 不能赋除了|连接的类型以外的值

console.log(sex);


// 2.不知道变量需要赋什么样的值的情况下可以使用any 但是需要注意如果使用any类型 那么ts将不会在检测这个变量
let a: any; // 可以赋值任何类型
let b: number;
// 还有需要注意的情况, 如果any类型被赋值了string类型值, 此时定义了一个number类型, 我们是可以将any类型赋值给number类型的, 可以通过类型检测, 如下
a = "apple";
b = a; // 不会报错

console.log(b); // apple TODO: 也就是说这玩意不仅霍霍自己还霍霍别人 tm的


// 3.这种情况我们建议使用unknown类型, 这个就是类型安全的any, 也可以给它赋值任意类型, 但是不能把它赋值给其它变量, 如下
let c: unknown;
// b = c; // Error: 不能将unknown类型赋值给其它数据类型数据


// 4.那么就有小伙伴有疑问了, 如果说我把这个unknown类型的数据赋值成了number类型, 这时可不可以赋值呢? 答案还是不行, 不过如果你明确它的类型的话, 我们可以借助一些手法完成赋值
// 第一种就是使用typeof判断
if (typeof c === "number") {
  b = c;
}

// 第二种类型断言 as 数据类型
c = 100;
b = c as number; // 此时赋值就没有问题了

// 简写写法 <数据类型>变量
b = <number>c;

// void 和 never
// void: 空值 没有值
// never: 不返回
// 其实我的理解就是void和never就像我们去上厕所时看到的厕纸(卷纸), 有三种情况
// 1.有纸: 有值 any
// 2.只有卷纸筒: 没有值 void
// 3.连卷纸筒都没有: never


// 5.类型的别名: 此时myType 等价与string string能使用的地方 myType都能使用
type myType = string;
type newType1 = 1 | 2 | 3 | 4 | 5;
let k1: newType1;
let k2: newType1;
let k3: newType1;

k1 = 1;
k2 = 5;
// k3 = 6; // Error